﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FlyShopWeb.Models;
using System.Data.OleDb;

namespace FlyShopWeb.DAO
{
    public class VooDao
    {

        public List<Voo> Lista()
        {

            // Abre a conexão
            DBSession sessao = new DBSession();
            sessao.Abrir();

            String sqlConsulta = "select v.cod_voo, v.nome, v.valor, v.total_assentos, v.assentos_disponiveis, arnv.descricao as aerononave, v.data_partida, v.data_chegada, cp.nome as Cidade_Partida, cc.nome as Cidade_Chegada " +
                     "from voo v, aeronave arnv, aeroporto ac, aeroporto ap, cidade cc, cidade cp where v.cod_aeronave = arnv.cod_aeronave and v.cod_aeroporto_chegada = ac.cod_aeroporto and v.cod_aeroporto_partida = ap.cod_aeroporto " + 
                     " and ap.cod_cidade = cp.cod_cidade and ac.cod_cidade = cc.cod_cidade order by (case when data_partida <= sysdate then 'z' else 'a' end), data_partida";


            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = sessao.GetConexao();
            comando.CommandText = sqlConsulta;
            
            // Executa o select
            OleDbDataReader dr = comando.ExecuteReader();

            // Itera em cada registro popoulando a lista de voos
            List<Voo> voos = new List<Voo>();
            while (dr.Read())
            {
                Voo voo = new Voo()
                {
                    Codigo = Convert.ToInt32(dr["cod_voo"]),
                    Nome = dr["nome"].ToString(),
                    Valor = Convert.ToDouble(dr["valor"]),
                    TotalAssentos = Convert.ToInt32(dr["total_assentos"]),
                    AssentosDisponiveis = Convert.ToInt32(dr["assentos_disponiveis"]),
                    NomeAeronave = dr["aerononave"].ToString(),
                    DataPartida = DateTime.Parse(dr["data_partida"].ToString()),
                    DataChegada = DateTime.Parse(dr["data_chegada"].ToString()),
                    CidadePartida = dr["cidade_partida"].ToString(),
                    CidadeChegada = dr["cidade_chegada"].ToString()
                };

                voos.Add(voo);
            }

            // Fecha a conexão
            sessao.Fechar();

            return voos;
        }

        public List<Voo> Filtrar(FiltroVoo filtroVoo) 
        {
            // Abre a conexão
            DBSession sessao = new DBSession();
            sessao.Abrir();


            int codCidadeOrigem = filtroVoo.CodCidadeOrigem;
            int codCidadeDestino = filtroVoo.CodCidadeDestino;

            String sqlConsulta = "select v.cod_voo, v.nome, v.valor, v.total_assentos, v.assentos_disponiveis, arnv.descricao as aerononave, v.data_partida, v.data_chegada, cp.nome as Cidade_Partida, cc.nome as Cidade_Chegada " +
                     "from voo v, aeronave arnv, aeroporto ac, aeroporto ap, cidade cc, cidade cp where v.cod_aeronave = arnv.cod_aeronave and v.cod_aeroporto_chegada = ac.cod_aeroporto and v.cod_aeroporto_partida = ap.cod_aeroporto " +
                     " and ap.cod_cidade = cp.cod_cidade and ac.cod_cidade = cc.cod_cidade and cp.cod_cidade = " + codCidadeOrigem + " and cc.cod_cidade = " + codCidadeDestino + " order by (case when data_partida <= sysdate then 'z' else 'a' end), data_partida";


            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = sessao.GetConexao();
            comando.CommandText = sqlConsulta;

            // Executa o select
            OleDbDataReader dr = comando.ExecuteReader();

            // Itera em cada registro popoulando a lista de voos
            List<Voo> voos = new List<Voo>();
            while (dr.Read())
            {
                Voo voo = new Voo()
                {
                    Codigo = Convert.ToInt32(dr["cod_voo"]),
                    Nome = dr["nome"].ToString(),
                    Valor = Convert.ToDouble(dr["valor"]),
                    TotalAssentos = Convert.ToInt32(dr["total_assentos"]),
                    AssentosDisponiveis = Convert.ToInt32(dr["assentos_disponiveis"]),
                    NomeAeronave = dr["aerononave"].ToString(),
                    DataPartida = DateTime.Parse(dr["data_partida"].ToString()),
                    DataChegada = DateTime.Parse(dr["data_chegada"].ToString()),
                    CidadePartida = dr["cidade_partida"].ToString(),
                    CidadeChegada = dr["cidade_chegada"].ToString()
                };

                voos.Add(voo);
            }

            // Fecha a conexão
            sessao.Fechar();

            return voos;
        }

        public Voo BuscaPorId(int id)
        {

            // Regra para buscar um voo pelo seu id

            return null;
        }


        public void Atualiza(Voo voo)
        { 
            // regra para atualizar o registro
        }

        public void Salva(Voo voo)
        { 
            // regra para salvar o registro
        }

        public void Deleta(Voo voo)
        { 
            // regra para deletar o registro
        }

    }
}